#include "BlockingSocket.h"

using namespace WONAPI;

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
BlockingSocket::BlockingSocket(SocketType theType) : QueueSocket(theType)
{
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::Connect(const IPAddr &theAddr, DWORD theTimeout)
{
	ConnectOpPtr anOp = new ConnectOp(theAddr,this);
	anOp->RunBlock(theTimeout);
	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::Accept(AsyncSocketPtr &theSocket, DWORD theTimeout)
{
	AcceptOpPtr anOp = new AcceptOp(this);
	if(anOp->RunBlock(theTimeout))
		theSocket = anOp->GetAcceptedSocket();

	return anOp->GetStatus();

}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::SendBytes(const ByteBuffer *theBytes, DWORD theTimeout)
{
	SendBytesOpPtr anOp = new SendBytesOp(theBytes,this);
	anOp->RunBlock(theTimeout);
	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::RecvBytes(ByteBufferPtr &theBytes, DWORD theNumBytes, DWORD theTimeout)
{
	RecvBytesOpPtr anOp = new RecvBytesOp(theNumBytes,this);
	if(anOp->RunBlock(theTimeout))
		theBytes = anOp->GetBytes();

	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::SendBytesTo(const ByteBuffer *theBytes, const IPAddr &theAddr, DWORD theTimeout)
{
	SendBytesToOpPtr anOp = new SendBytesToOp(theBytes,theAddr,this);
	anOp->RunBlock(theTimeout);
	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::RecvBytesFrom(ByteBufferPtr &theBytes, unsigned short theMaxBytes, IPAddr &theAddr, DWORD theTimeout)
{
	RecvBytesFromOpPtr anOp = new RecvBytesFromOp(theMaxBytes,this);
	if(anOp->RunBlock(theTimeout))
	{
		theAddr = anOp->GetAddr();
		theBytes = anOp->GetBytes();
	}
	
	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::SendMsg(const ByteBuffer *theMsg, DWORD theTimeout)
{
	SendMsgOpPtr anOp = new SendMsgOp(theMsg,this);
	anOp->RunBlock(theTimeout);
	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::RecvMsg(ByteBufferPtr &theMsg, DWORD theTimeout)
{
	RecvMsgOpPtr anOp = new RecvMsgOp(this);
	if(anOp->RunBlock(theTimeout))
		theMsg = anOp->GetMsg();

	return anOp->GetStatus();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
WONStatus BlockingSocket::RecvCRMsg(ByteBufferPtr &theMsg, DWORD theTimeout)
{
	RecvCRMsgOpPtr anOp = new RecvCRMsgOp(this);
	if(anOp->RunBlock(theTimeout))
		theMsg = anOp->GetMsg();

	return anOp->GetStatus();
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

